﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data;
using MySql.Data;
using MySql.Data.MySqlClient;
using Entities;

namespace DAL
{
    public class ArticulosDAL
    {
        private static MySqlConnection SqlConnection1;
        private static MySqlDataAdapter SqlDataAdapter1;
        private static MySqlCommand SqlSelectCommand1;
        private static MySqlCommand SqlInsertCommand1;
        private static MySqlCommand SqlUpdateCommand1;
        private static MySqlCommand SqlDeleteCommand1;
        public static DataSet dt;
        private static DataTable boundTable;
       
        public static DataSet CrearDataset()
        {
            MySqlDataAdapter da = AdaptadorSELECT();
            dt = new DataSet();
            da.Fill(dt, "Articulos");                
            return dt;
        }

        public static DataTable Buscar(DataTable tabla, TextBox txtParametros, string opcion)
        {
            try
            {
                if (opcion == "Descripcion")
                {
                    IEnumerable<DataRow> query =
                    from articulo in tabla.AsEnumerable()
                    where (articulo.RowState != DataRowState.Deleted)
                    select articulo;
                    boundTable = query.CopyToDataTable<DataRow>();
                    IEnumerable<DataRow> query2 =
                        from articulo in boundTable.AsEnumerable()
                        where (articulo.Field<string>("DescripcionART").ToLower().Contains(txtParametros.Text.ToLower()))
                        select articulo;
                    boundTable = query2.CopyToDataTable<DataRow>();
                    return boundTable;
                }
                else
                {
                    IEnumerable<DataRow> query =
                    from articulo in tabla.AsEnumerable()
                    where (articulo.RowState != DataRowState.Deleted)
                    select articulo;
                    boundTable = query.CopyToDataTable<DataRow>();
                    IEnumerable<DataRow> query2 =
                        from articulo in boundTable.AsEnumerable()
                        where (articulo.Field<string>("IdArticuloART").ToLower().StartsWith(txtParametros.Text.ToLower()))
                        select articulo;
                    boundTable = query2.CopyToDataTable<DataRow>();
                    return boundTable;                
                }

            }
            catch (InvalidOperationException)
            {
                MessageBox.Show("No se encontraron registros coincidentes.", "NcSoft", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return boundTable;
            }

        }

        public static void InsertarDT(DataTable tabla, Entities.Articulos entidad)
        {
            DataRowCollection cfilas = tabla.Rows;
            DataRow nuevaFila;
            try
            {
                nuevaFila = tabla.NewRow();
                nuevaFila[0] = entidad.IdArticulo.ToString();
                nuevaFila[1] = entidad.IdItem.ToString();
                nuevaFila[2] = entidad.IdColor;
                nuevaFila[3] = entidad.Talle.ToString();
                nuevaFila[4] = entidad.IdProveedor.ToString();
                nuevaFila[5] = entidad.Descripcion.ToString();
                nuevaFila[6] = entidad.DescripcionWeb.ToString();
                nuevaFila[7] = entidad.PrecioCosto.ToString();
                nuevaFila[8] = entidad.PrecioPublico.ToString();
                nuevaFila[9] = entidad.PrecioMayor.ToString();
                nuevaFila[10] = entidad.Fecha;
                nuevaFila[11] = entidad.Imagen.ToString();
                cfilas.Add(nuevaFila);
            }
            catch (ConstraintException)
            {
                MessageBox.Show("El artículo '" + entidad.IdArticulo.ToString() + " " + entidad.Descripcion.ToString() + "' ya existe. No se creó el artículo.", 
                    "NcSoft",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Exclamation,
                    MessageBoxDefaultButton.Button1);                
            }
        }

        public static void EditarDT(DataRowView vistaFilaActual, Entities.Articulos entidad)
        {
            vistaFilaActual.BeginEdit();
            vistaFilaActual["IdArticuloART"] = entidad.Descripcion.ToString();
            vistaFilaActual["IdItemART"] = entidad.IdItem.ToString();
            vistaFilaActual["IdColorART"] = entidad.IdColor.ToString();
            vistaFilaActual["TalleART"] = entidad.Talle.ToString();
            vistaFilaActual["IdProveedorART"] = entidad.IdProveedor.ToString();
            vistaFilaActual["DescripcionART"] = entidad.Descripcion.ToString();
            vistaFilaActual["PrecioCostoART"] = entidad.PrecioCosto.ToString();
            vistaFilaActual["PrecioPublicoART"] = entidad.PrecioPublico.ToString();
            vistaFilaActual["PrecioMayorART"] = entidad.PrecioMayor.ToString();
            vistaFilaActual["FechaART"] = entidad.Fecha.ToString();
            vistaFilaActual["ImagenART"] = entidad.Imagen.ToString();
            vistaFilaActual.EndEdit();
        }

        public static void EditarDT(string idArticulo, DataTable tbl, Entities.Articulos entidad, DataSet dt)
        {
            DataRow[] foundRows;
            foundRows = dt.Tables["Articulos"].Select("IdArticuloART = " + idArticulo);
            DataRow filaActual = foundRows[0];
            filaActual.BeginEdit();
            filaActual["IdArticuloART"] = entidad.Descripcion.ToString();
            filaActual["IdItemART"] = entidad.IdItem.ToString();
            filaActual["IdColorART"] = entidad.IdColor.ToString();
            filaActual["TalleART"] = entidad.Talle.ToString();
            filaActual["IdProveedorART"] = entidad.IdProveedor.ToString();
            filaActual["DescripcionART"] = entidad.Descripcion.ToString();
            filaActual["PrecioCostoART"] = entidad.PrecioCosto.ToString();
            filaActual["PrecioPublicoART"] = entidad.PrecioPublico.ToString();
            filaActual["PrecioMayorART"] = entidad.PrecioMayor.ToString();
            filaActual["FechaART"] = entidad.Fecha.ToString();
            filaActual["ImagenART"] = entidad.Imagen.ToString();
            filaActual.EndEdit();
        }

        public static void BorrarDT(DataGridView gvwDatos, string origen, DataSet dt)
        {
            if (MessageBox.Show("¿Desea borrar este registro?", "Buscar", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                if (origen != "Articulos")
                {
                    var registro = ((DataRowView)gvwDatos.CurrentRow.DataBoundItem)["IdArticuloART"].ToString();
                    DataRow[] foundRows;
                    foundRows = dt.Tables["Articulos"].Select("IdArticuloART = " + registro);
                    foundRows[0].Delete();
                }
                DataRowView vistaFilaActual = (DataRowView)gvwDatos.CurrentRow.DataBoundItem;
                vistaFilaActual.Row.Delete();
            }
        }

        public static void GrabarDB(DataSet dt, MySqlConnection conn, MySqlTransaction tr)
        {
            try
            {
                MySqlDataAdapter da = AdaptadorABM(conn, tr);
                da.Update(dt, "Articulos");
            }
            catch (MySqlException ex)
            {
                MessageBox.Show(ex.ToString(), "NcSoft", MessageBoxButtons.OK, MessageBoxIcon.Information);
                dt.RejectChanges();
            }
        }

        private static MySqlDataAdapter AdaptadorSELECT()
        {
            SqlConnection1 = DALBase.GetConnection();
            SqlDataAdapter1 = new MySqlDataAdapter();
            SqlSelectCommand1 = new MySqlCommand("Articulos_Listar", SqlConnection1);
            SqlDataAdapter1.SelectCommand = SqlSelectCommand1;
            SqlSelectCommand1.CommandType = CommandType.StoredProcedure;
            return SqlDataAdapter1;
        }

        private static MySqlDataAdapter AdaptadorABM(MySqlConnection SqlConnection1, MySqlTransaction tr)
        {
            SqlDataAdapter1 = new MySqlDataAdapter();
            SqlInsertCommand1 = new MySqlCommand("Articulos_Insertar", SqlConnection1);
            SqlUpdateCommand1 = new MySqlCommand("Articulos_Actualizar", SqlConnection1);
            SqlDeleteCommand1 = new MySqlCommand("Articulos_Borrar", SqlConnection1);
            SqlInsertCommand1.Transaction = tr;
            SqlUpdateCommand1.Transaction = tr;
            SqlDeleteCommand1.Transaction = tr;
            SqlDataAdapter1.DeleteCommand = SqlDeleteCommand1;
            SqlDataAdapter1.InsertCommand = SqlInsertCommand1;
            SqlDataAdapter1.UpdateCommand = SqlUpdateCommand1;

            // IMPLEMENTACIÓN DE LA ORDEN UPDATE
            SqlUpdateCommand1.Parameters.Add("p_id", MySqlDbType.VarChar, 55, "IdArticuloART");
            SqlUpdateCommand1.Parameters.Add("p_idItem", MySqlDbType.Int32, 11, "IdItemART");
            SqlUpdateCommand1.Parameters.Add("p_idColor", MySqlDbType.Int32, 11, "IdColorART");
            SqlUpdateCommand1.Parameters.Add("p_talle", MySqlDbType.VarChar, 50, "TalleART");
            SqlUpdateCommand1.Parameters.Add("p_idProveedor", MySqlDbType.Int32, 11, "IdProveedorART");
            SqlUpdateCommand1.Parameters.Add("p_descripcion", MySqlDbType.VarChar, 55, "DescripcionART");
            SqlUpdateCommand1.Parameters.Add("p_descripcionWeb", MySqlDbType.VarChar, 50, "DescripcionWebART");
            SqlUpdateCommand1.Parameters.Add("p_precioCosto", MySqlDbType.Decimal, 19, "PrecioCostoART");
            SqlUpdateCommand1.Parameters.Add("p_precioPublico", MySqlDbType.Decimal, 19, "PrecioPublicoART");
            SqlUpdateCommand1.Parameters.Add("p_precioMayor", MySqlDbType.Decimal, 19, "PrecioMayorART");
            SqlUpdateCommand1.Parameters.Add("p_fecha", MySqlDbType.DateTime, 19, "FechaART");
            SqlUpdateCommand1.Parameters.Add("p_imagen", MySqlDbType.VarChar, 50, "ImagenART");
            SqlUpdateCommand1.CommandType = CommandType.StoredProcedure;

            // IMPLEMENTACIÓN DE LA ORDEN INSERT
            SqlInsertCommand1.Parameters.Add("p_id", MySqlDbType.VarChar, 55, "IdArticuloART");
            SqlInsertCommand1.Parameters.Add("p_idItem", MySqlDbType.Int32, 11, "IdItemART");
            SqlInsertCommand1.Parameters.Add("p_idColor", MySqlDbType.Int32, 11, "IdColorART");
            SqlInsertCommand1.Parameters.Add("p_talle", MySqlDbType.VarChar, 50, "TalleART");
            SqlInsertCommand1.Parameters.Add("p_idProveedor", MySqlDbType.Int32, 11, "IdProveedorART");
            SqlInsertCommand1.Parameters.Add("p_descripcion", MySqlDbType.VarChar, 55, "DescripcionART");
            SqlInsertCommand1.Parameters.Add("p_descripcionWeb", MySqlDbType.VarChar, 50, "DescripcionWebART");
            SqlInsertCommand1.Parameters.Add("p_precioCosto", MySqlDbType.Decimal, 19, "PrecioCostoART");
            SqlInsertCommand1.Parameters.Add("p_precioPublico", MySqlDbType.Decimal, 19, "PrecioPublicoART");
            SqlInsertCommand1.Parameters.Add("p_precioMayor", MySqlDbType.Decimal, 19, "PrecioMayorART");
            SqlInsertCommand1.Parameters.Add("p_fecha", MySqlDbType.DateTime, 19, "FechaART");
            SqlInsertCommand1.Parameters.Add("p_imagen", MySqlDbType.VarChar, 50, "ImagenART");
            SqlInsertCommand1.CommandType = CommandType.StoredProcedure;

            // IMPLEMENTACIÓN DE LA ORDEN DELETE
            SqlDeleteCommand1.Parameters.Add("p_id", MySqlDbType.VarChar, 55, "IdArticuloART");
            SqlDeleteCommand1.CommandType = CommandType.StoredProcedure;

            return SqlDataAdapter1;
        }

    }

}
